作为一个聚合SDK,除了转接用户的广告请求,另外一个很重要的工作方面就是用户体验上的质量 保障,这其中就包含三方广告源的用户质量保证。下面,就几个用户体验的点探讨一下把控的思路。
广告长时间没有反应,如何实时监控并处理
这个问题其实可以从ANR卡顿问题的处理方案中寻找灵感
1 监控FPS刷新
通过CADisplayLink监听屏幕刷新信号。如果fps发生明显下滑,说明发生了卡顿。参考文献:获取PFS
2 ping主线程
启动一个监控线程,每隔一段时间(后台配置)ping一下主线程,如果主线程有空,必然会有回馈;如果没有回馈,说明主线程任务忙,可以打印主线程目前的函数调用栈。
3 对比调用堆栈
代码质量不够好的方法可能会在一段时间内持续占用CPU的资源,换句话说在一段时间内,调用栈总是停留在执行某个地址指令的状态。如果两次调用栈的符号信息,后者包含前者,可以认定为出现了卡顿。
4 重写msgSend
在函数调用前后插入自定义函数,维护一个函数栈调用表,可以获取每一个OC方法的调用耗时,以此进行性能分析与优化
如何监控上游三方广告源的关闭按钮是否成功渲染出来
这里有两个方案,根据业务场景选择合适的方案:
方案一:截屏后OCR
在广告曝光后,或者曝光后3秒,对当前屏幕进行截屏,然后通过OCR识别截图中是否存在关闭按钮。
方案二:遍历图层结构
遍历当前VC的所有图层结构,找寻是否存在关闭按钮view。
方案一是通用方案,相比方案二,首次开发成本高,后续的维护成本很低。另外就是方案二也受上游SDK版本的影响,一旦三方变更了实现方式,监控效果极有可能失效。
如何确认视频类广告播放正常
iOS下的异常监控方案
实时模块
1 内存水位监控
通过对vm_logger,malloc_logger,OC对象的alloc进行hook,统计内存的申请和释放,达到一个内存水位实时监控的目的。对设置内存警告水位,在crash前,对当前内存水位进行上报。
2 ANR卡顿监控
ANR卡顿的方案很多,这里不多赘述。触发ANR的时候,对当前的设备进行及程序运行状态进行上报。
3 图层监控
交互卡住还有一个令人哭笑不得的场景:广告落地页再一个新建的window上展示,关闭落地页后,VC销毁,但是window还在屏幕上,导致应用流畅,但是无法响应用户的交互。
针对这个场景,可实时监控空window并移除。
延时模块
1 日志读取
iOS有一个看门狗机制,在程序崩溃的时候,都会留下日志,根据exception code类型可以知道崩溃的类型,筛选指定的类型,将日志上报进行分析